Julia の型
整数型 Int8 UInt8 Int16 UInt16 Int32 UInt32 Int64 UInt64 Int128 UInt128 Bool(整数に入るらしい) 浮動小数点数型 Float16 Float32 Float64 文字型 Char
code:julia
julia> 100 :: Int64
100
julia> 100 :: Float64
ERROR: TypeError: in typeassert, expected Float64, got a value of type Int64
Stacktrace:
1 top-level scope at REPL2:1 ローカルスコープにおいては左辺値にも型注釈を書ける
code:julia
julia> function foo()
x::Float64 = 100
x
end
foo (generic function with 1 method)
julia> foo()
100.0
julia> typeof(ans)
Float64
code:julia
julia> function bar(x::Int64)::Float64
x
end
bar (generic function with 1 method)
julia> bar(100)
100.0
julia> typeof(ans)
Float64
抽象型(Abstract Types)
型グラフ上にノードとしてのみ存在し、実体化できない型
抽象型で型の階層構造を作ることができる
宣言には abstract type キーワードを用いる
code:julia
abstract type «name» end
abstract type «name» <: «supertype» end
«supertype» を省略すると暗黙のうちに Any が «supertype» として使用される
整数型、浮動小数点型の階層構造
code:julia
abstract type Number end
abstract type Real <: Number end
abstract type AbstractFloat <: Real end
abstract type Integer <: Real end
abstract type Signed <: Integer end
abstract type Unsigned <: Integer end
<: 演算子で型がサブタイプかどうか調べることができる
code:julia
julia> Integer <: Number
true
julia> Integer <: AbstractFloat
false
抽象型はジェネリックな関数を書く時に重要になってくる
例えば以下のような関数を書いたとする
code:julia
julia> function myplus(x,y)
x+y
end
この時暗黙のうちに x::Any、y::Any なのでこうなっちゃう
code:julia
julia> myplus(1,1)
2
julia> myplus(1.0,1)
2.0
julia> myplus('c',1)
'd': ASCII/Unicode U+0064 (category Ll: Letter, lowercase)
やり放題である
なのでこんな感じが多分いい
code:julia
julia> function myplus(x::Number,y::Number)::Number
x+y
end
型は書け
複合型(Composite Types)
ただし関数は含まない
メソッドの動的ディスパッチによる言語デザインによるものらしい 後でわかったらまた書く
struct キーワードで宣言
code:julia
julia> struct Foo
bar
baz::Int
quax::Float64
end
julia> foo = Foo("Hello, world.", 23, 1.5)
Foo("Hello, world.", 23, 1.5)
julia> typeof(foo)
Foo
2 つのデフォルトコンストラクタが生成される
1 つは完全に型が一致するもの
foo.bar でフィールドを読み込める
code:julia
julia> foo.bar
"Hello, world."
イミュータブルなので書き込みはできない
code:julia
julia> foo.bar = "nyaan"
ERROR: setfield! immutable struct of type Foo cannot be changed
Stacktrace:
1 setproperty!(::Foo, ::Symbol, ::String) at ./Base.jl:34 2 top-level scope at REPL37:1 code:julia
julia> fieldnames(Foo)
(:bar, :baz, :qaux)
code:julia
julia> struct NoFields
end
julia> NoFields() === NoFields()
true
=== はオブジェクトが同じであるかを返す演算子
ミュータブルな複合型(Mutable Composite Types)
書きかけ